// 分裂游戏
// 一共有n个瓶子，编号为0 ~ n-1，第i瓶里装有nums[i]个糖豆，每个糖豆认为无差别
// 有两个玩家轮流取糖豆，每一轮的玩家必须选i、j、k三个编号，并且满足i < j <= k
// 当前玩家从i号瓶中拿出一颗糖豆，分裂成两颗糖豆，并且往j、k瓶子中各放入一颗，分裂的糖豆继续无差别
// 要求i号瓶一定要有糖豆，如果j == k，那么相当于从i号瓶中拿出一颗，向另一个瓶子放入了两颗
// 如果轮到某个玩家发现所有糖豆都在n-1号瓶里，导致无法行动，那么该玩家输掉比赛
// 先手希望知道，第一步如何行动可以保证自己获胜，要求返回字典序最小的行动
// 第一步从0号瓶拿出一颗糖豆，并且往2、3号瓶中各放入一颗，可以确保最终自己获胜
// 第一步从0号瓶拿出一颗糖豆，并且往11、13号瓶中各放入一颗，也可以确保自己获胜
// 本题要求每个瓶子的编号看做是一个字符的情况下，最小的字典序，所以返回"0 2 3"
// 如果先手怎么行动都无法获胜，返回"-1 -1 -1"
// 先手还希望知道自己有多少种第一步取糖的行动，可以确保自己获胜，返回方法数
// 测试链接 : https://www.luogu.com.cn/problem/P3185
// 提交以下的code，可以直接通过

#include <bits/stdc++.h>

using namespace std;

// 20 -> 0
// 左    右
const int MAXN = 21;
int nums[MAXN];
int sg[MAXN];
const int MAXV = 101;
bool appear[MAXV];
int t, n;

inline int read()
{
    char ch = getchar();
    int x = 0, f = 1;
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = 10 * x + ch - '0';
        ch = getchar();
    }
    return f * x;
}

void build()
{
    for(int i = 1; i < MAXN; ++i)
    {
        memset(appear, 0, sizeof appear);
        for(int j = i - 1; j >= 0; --j)
        {
            for(int k = j; k >= 0; --k)
            {
                appear[sg[j] ^ sg[k]] = true;
            }
        }
        for(int s = 0; s < MAXV; ++s)
        {
            if(!appear[s])
            {
                sg[i] = s;
                break;
            }
        }
    }
}

void compute()
{
    int eor = 0; // 每个糖果都是独立游戏，所以把所有糖果的sg值异或
    for(int i = n - 1; i >= 0; --i)
    {
        if(nums[i] % 2 == 1) eor ^= sg[i];
    }
    // 先手处于必败状态
    if(eor == 0)
    {
        puts("-1 -1 -1\n0");
        return;
    }

    int cnt = 0, a = -1, b = -1, c = -1, pos;
    for(int i = n - 1; i >= 1; --i)
    {
        if(nums[i] > 0) // 当前这个瓶子有糖果
        {
            for(int j = i - 1; j >= 0; --j)
            {
                for(int k = j; k >= 0; --k)
                {
                    // i > j >= k
                    // 拿出 i 瓶子中的一个糖果分裂成两个放入到 j、k 瓶子中
                    pos = eor ^ sg[i] ^ sg[j] ^ sg[k];
                    if(pos == 0) // 后手面临必败的局面
                    {
                        ++cnt;
                        if(a == -1)
                        {
                            a = i;
                            b = j;
                            c = k;
                        }
                    }
                }
            }
        }
    }
    printf("%d %d %d\n%d\n", n - 1 - a, n - 1 - b, n - 1 - c, cnt);
}

int main()
{
    build();
    t = read();
    while(t--)
    {
        n = read();
        for(int i = n - 1; i >= 0; --i) nums[i] = read();
        compute();
    }

    return 0;
}